package com.jicoma.ic; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; import java.util.logging.Logger; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.bouncycastle.crypto.BufferedBlockCipher; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.modes.CBCBlockCipher; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; import org.xml.sax.InputSource; import com.ic.BuzzerStarMovie.FindXmlHandler; public class BuzzerProxyThread extends Thread { private Socket socket = null; private byte[] cipherText = null; private String searchurl; private FindXmlHandler myXmlHandler; private CacheManager cache; private String privatekey; private int maxresults; private String lauftext; private String linktext; private String httpauthpassword; private String httpauthlogin; private TemporaryCache tCache; private int maxfreerequests; private int premiumsms; private String paymentscreen; private SQLFactory sqlFactory; public BuzzerProxyThread(Socket socket, int[] ports, String searchurl, String privatekey, int maxresults,String lauftext,String linktext, String httpauthpassword,String httpauthlogin, int maxfreerequests, int premiumsms, String paymentscreen, Logger searchLog) { super("BuzzerProxyThread"); this.socket = socket; this.searchurl = searchurl; this.privatekey = privatekey; this.maxresults = maxresults; this.lauftext = lauftext; this.linktext = linktext; this.httpauthpassword = httpauthpassword; this.httpauthlogin = httpauthlogin; this.maxfreerequests = maxfreerequests; this.premiumsms = premiumsms; this.paymentscreen = paymentscreen; tCache = new TemporaryCache(); try { cache = new CacheManager(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { System.out.println("In run angekommen"); try { System.out.println("In try angekommen"); //GZIPOutputStream out = new GZIPOutputStream(socket.getOutputStream()); //PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("nach Buffered reader"); String inputLine, outputLine; String cryptText= in.readLine(); //System.out.println("nach in read line: "+ cryptText); String[] strArray = cryptText.split("##"); //System.out.println(privatekey.getBytes()+"strArray "+ strArray[0]+ "cryptText "+ cryptText); outputLine = performDecrypt(Hex.decode(privatekey.getBytes()), strArray[2]); //System.out.println(outputLine); if(outputLine.startsWith("")){ //if(outputLine.contains("FIND")){ outputLine = outputLine.substring(11); outputLine = outputLine.trim(); System.out.println(outputLine); try{ myXmlHandler = ( FindXmlHandler ) fromString( outputLine ); }catch(Exception e){ System.out.println(e); } //myXmlHandler = prepareFindXml("outputLine"); System.out.println("servicetype: "+myXmlHandler.getServiceTyp()); System.out.println("clientversion: "+myXmlHandler.getClientVersion()); System.out.println("xmlversion: "+myXmlHandler.getXmlVersion()); System.out.println("searchtext: "+myXmlHandler.getSearchText()); System.out.println("media: "+myXmlHandler.getMedia()); System.out.println("key: "+myXmlHandler.getKey()); System.out.println("language: "+myXmlHandler.getLanguage()); System.out.println("android: "+myXmlHandler.getAndroid()); System.out.println("noporn: "+myXmlHandler.getNoPorn()); String noporn = myXmlHandler.getNoPorn(); // int page = myXmlHandler.getPage(); // String searchQuery = myXmlHandler.getSearchText(); String imei = myXmlHandler.getImei(); ArrayList searchresults = searchForResults(searchQuery , page, noporn, maxresults ); ArrayList myRes = new ArrayList(); int count = 0; for (ResultContainer i : searchresults) { if ( count <= maxresults ){ myRes.add(i); } count++; } /* * MYSQL: SELECT status from licencemanagement WHERE imei="myImei"; * if MYSQL_status < maxfreerequests: allow more requests; tCache.setStatus(1); * if MYSQL_status > maxfreerequests: SHOW_PAYMENT_SCREEN, tCache.setStatus(0); allow: PREVIEW ONLY * */ // tCache.setCache(imei); int licenceStatus = sqlFactory.getLicenceStatus(imei, maxfreerequests); tCache.setStatus(licenceStatus); //TODO Paul: String resultsXml = sendResultsToMobile(myRes,lauftext,linktext,httpauthpassword,httpauthlogin,premiumsms, paymentscreen); // String resEncryptString = performEncrypt(resultsXml); // MobileSocketSend(resEncryptString); // SEND resultsXml TO HANDY } /* * Payment Result kommt vom Handy: * Handy: premium sms erfolgreich versendet, dann sende danach an proxy paymentdonerequest * hier an dieser codestelle wird der sql server geupdated, die imei vom handy bekommt suchguthaben * * */ if(outputLine.startsWith("")){ outputLine = outputLine.substring(11); outputLine = outputLine.trim(); try{ myXmlHandler = ( FindXmlHandler ) fromString( outputLine ); }catch(Exception e){ System.out.println(e); } int paymentDone = myXmlHandler.getPayment(); // hole das payment int flag vom handy aus seinem xml request heraus String imei = myXmlHandler.getImei(); if ( paymentDone == 1 ){ int result = sqlFactory.setLicenceStatus(imei); } } in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } private String sendResultsToMobile(ArrayList myRes, String lauftext,String linktext, String httpauthpassword,String httpauthlogin, int premiumsms, String paymentscreen ){ StringBuilder xml = new StringBuilder(); int licence = tCache.getStatus(); xml.append(""); xml.append("SEARCHDELIVER"); xml.append("
"); xml.append("1.0.0.0"); xml.append("
"); xml.append(""); xml.append(""+lauftext+""); xml.append(""+linktext+""); xml.append(""+httpauthpassword+""); xml.append(""+httpauthlogin+""); xml.append(""+licence+""); // Status 1: all requests allowed / Status 0: show payment screen, Allow only previews xml.append(""+premiumsms+""); xml.append(""+paymentscreen+""); /* * paymentscreen=m:5;s:3;p:3 * m:5=>alle 5 minuten payment screen * s:3=>alle 3 Suchanfragen payment screen * p:3=>alle 3 preview screens payment screen * fd:1 = free user maximal 1 paralleler download * f:50 => free user dürfen mit maximal 50Kbyte/s downloaden * */ xml.append(""); for (ResultContainer i : myRes) { xml.append(""); String typ = i.getTyp(); xml.append(""+typ+""); String preview = i.getPreview(); xml.append(""+preview+""); String securepreview = i.getSecurePreview(); xml.append(""+securepreview+""); String link = i.getLink(); xml.append(""+link+""); String securelink = i.getSecureLink(); xml.append(""+securelink+""); String name = i.getName(); xml.append(""+name+""); String size = i.getSize(); xml.append(""+size+""); String catg = i.getCategory(); xml.append(""+catg+""); xml.append(""); } xml.append(""); xml.append(""); return xml.toString(); } private static Object fromString( String s ) throws IOException ,ClassNotFoundException { byte [] data = Base64Coder.decode( s ); ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream( data ) ); Object o = ois.readObject(); ois.close(); return o; } /* private FindXmlHandler prepareFindXml(String xml){ FindXmlHandler myXmlHandler = null; try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); StringReader sr = new StringReader(xml); myXmlHandler = new FindXmlHandler(); saxParser.parse(new InputSource(sr), myXmlHandler); } catch (Exception e) { System.out.println("Error "+e.getMessage()); e.printStackTrace(); } return myXmlHandler; } */ private final String performDecrypt(byte[] key, String st){ cipherText = Hex.decode(st); BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine())); cipher.init(false, new KeyParameter(key)); byte[] rv = new byte[cipher.getOutputSize(cipherText.length)]; int oLen = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0); try { cipher.doFinal(rv, oLen); } catch (CryptoException ce) { System.out.println(ce.toString()); } return new String(rv).trim(); } private ArrayList searchForResults(String searchquery, int page, String noporn, int maxresults){ CacheManager cache = this.cache; String mysearchurl = this.searchurl; String mySearchQueryForResults = null; String content = null; URLConnection connection = null; //cache hit ArrayList res = cache.getResultContainerFor(searchquery, page); if ( res.size() >= maxresults ){ return res; } if (noporn.contains("1")){ mySearchQueryForResults = mysearchurl + "?q=" + searchquery + "&noporn=1"; } else { mySearchQueryForResults = mysearchurl + "?q=" + searchquery; } try { // hier richtige HTTPS GET Methode einbauen connection = new URL(mySearchQueryForResults).openConnection(); // scanner.useDelimiter("\\Z"); // ????????????????? content = new Scanner(connection.getInputStream()).next(); }catch ( Exception ex ) { ex.printStackTrace(); } System.out.println("content: "+content); HashMap> myCache = new HashMap>(); myCache = cache.fillCacheFromXML(searchquery, content.toString()); ArrayList currentResults = new ArrayList(); currentResults.addAll(res); for (String key : myCache.keySet()) { // System.out.println("Key: " + key + ", Value: " + myCache.get(key)); currentResults.addAll(myCache.get(key)); } return currentResults; } }